package hotel.mensagens;

import hotel.tipos.Servico;

import java.util.Vector;

import o2b.*;

public class ManterServico extends Mensagem{
	/**
	 * Indica o subtipo da mensagem
	 * 1 - Mensagem criar serviço
	 *  11 - Resposta OK
	 *  12 - Resposta NOK
	 * 2 - Mensagem busca serviço
	 *  21 - Resposta OK
	 *  22 - Resposta NOK
	 * 3 - Mensagem apaga serviço
	 *  31 - Resposta OK
	 *  32 - Resposta NOK
	 *  4 - Mensagem altera serviço
	 *   41 - Resposta OK
	 *   42 - Resposta NOK
	 * 5 - Mensagem Busca Todos os serviços
	 *  51 - resposta com todos os serviços
	 */
	protected int tipoManterServico;
	protected Servico servico;
	protected String servicoBusca;
	protected int found;
	protected Vector<Servico> vServicos;
	
	public ManterServico() {
		tipo = TipoMensagem.MANTERSERVICO;
		setServico(new Servico());
		getServico().setServiceId(0);
	}
	
	/**
	 * @param tipoManterServico
	 * Indica o subtipo da mensagem
	 * 1 - Mensagem criar serviço
	 *  11 - Resposta OK
	 *  12 - Resposta NOK
	 * 2 - Mensagem busca serviço
	 *  21 - Resposta OK
	 *  22 - Resposta NOK
	 * 3 - Mensagem apaga serviço
	 *  31 - Resposta OK
	 *  32 - Resposta NOK
	 *  4 - Mensagem altera serviço
	 *   41 - Resposta OK
	 *   42 - Resposta NOK
	 * 5 - Mensagem Busca Todos os serviços
	 *  51 - resposta com todos os serviços
	 */
	public ManterServico(int tipoManterServico){
		tipo = TipoMensagem.MANTERSERVICO;
		this.tipoManterServico = tipoManterServico;
		setServico(new Servico());
		getServico().setServiceId(0);
	}
	
	/**
	 * Envia nome do servico a buscar
	 */
	@Override
	public void marshal(IStream stream) throws MarshallableException {
		super.marshal(stream);
		stream.write(tipoManterServico);
		switch(tipoManterServico){
			case 1:
				stream.write(servico.getDescricao());
				stream.write(servico.getPreco());
				break;
				
			case 11:
				break;
				
			case 12:
				break;
			
			case 2:
				stream.write(servicoBusca);
				break;
				
			// Se for uma resposta de uma busca, envia todos os dados do serviço encontrado
			case 21:
				stream.write(servico.getServiceId());
				stream.write(servico.getDescricao());
				stream.write(servico.getPreco());
				stream.write(getFound());
				break;
				
			case 22:
				break;
				
			case 3:
				stream.write(servico.getServiceId());
				stream.write(servico.getDescricao());
				stream.write(servico.getPreco());
				break;
				
			case 31:
				break;
				
			case 32:
				break;
				
			case 4:
				stream.write(servico.getServiceId());
				stream.write(servico.getDescricao());
				stream.write(servico.getPreco());
				break;
				
			case 5:
				break;
				
			case 51:
				int size = getvServicos().size();
				// Envia o tamanho do vetor
				stream.write(size);
				// Para cada elemento do vetor...
				for(int i=0; i < size; i++){
					// Envia as características do serviço
					stream.write(getvServicos().get(i).getServiceId());
					stream.write(getvServicos().get(i).getDescricao());
					stream.write(getvServicos().get(i).getPreco());
				}
				break;
				
			default:
				break;
		}
	}

	/**
	 * Recebe o Serviço
	 */
	@Override
	public void unmarshal(IStream stream) throws MarshallableException {
		this.tipoManterServico = stream.readInt();
		switch(tipoManterServico){
			case 1:
				getServico().setDescricao((String) stream.readObject());
				getServico().setPreco(stream.readDouble());
				break;
				
			case 11:
				break;
				
			case 2:
				setServicoBusca((String)stream.readObject());
				break;
				
			case 21:
				getServico().setServiceId(stream.readInt());
				getServico().setDescricao((String) stream.readObject());
				getServico().setPreco(stream.readDouble());
				setFound(stream.readInt());
				break;
				
			case 3:
				getServico().setServiceId(stream.readInt());
				getServico().setDescricao((String) stream.readObject());
				getServico().setPreco(stream.readDouble());
				break;
				
			case 4:
				getServico().setServiceId(stream.readInt());
				getServico().setDescricao((String) stream.readObject());
				getServico().setPreco(stream.readDouble());
				break;
				
			case 5:
				break;
				
			case 51:
				// Lê o tamanho do vetor a ser recebido
				int size = stream.readInt();
				setvServicos(new Vector<Servico>(size));
				for(int i=0; i < size; i++){
					Servico s = new Servico();
					s.setServiceId(stream.readInt());
					s.setDescricao((String)stream.readObject());
					s.setPreco(stream.readDouble());
					getvServicos().add(s);
				}
				break;
				
			default:
				break;
		}
	}
	
	public Servico getServico() {
		return servico;
	}

	public void setServico(Servico servico) {
		this.servico = servico;
	}

	public String getServicoBusca() {
		return servicoBusca;
	}

	public void setServicoBusca(String servicoBusca) {
		this.servicoBusca = servicoBusca;
	}

	public int getFound() {
		return found;
	}

	public void setFound(int found) {
		this.found = found;
	}

	public int getTipoManterServico() {
		return tipoManterServico;
	}

	public void setTipoManterServico(int tipoManterServico) {
		this.tipoManterServico = tipoManterServico;
	}

	public Vector<Servico> getvServicos() {
		return vServicos;
	}

	public void setvServicos(Vector<Servico> vServicos) {
		this.vServicos = vServicos;
	}
	
	
}
